package team.niit.service;

import team.niit.entity.CourseEntity;
import team.niit.errorenum.ErrorCodeEnum;

import java.util.List;

public interface CourseService {

    /**
     * 管理员查看所有课程
     * @return 返回所有课程
     */
    List<CourseEntity> list();
    /**
     * 管理员添加课程
     *
     * @param courseEntity 要添加的课程实体
     * @return 成功与否
     */
    boolean addCourse(CourseEntity courseEntity);

    /**
     * 管理员修改课程
     *
     * @param courseEntity 要修改的课程实体
     * @return 成功与否
     */
    boolean modifyCourse(CourseEntity courseEntity);

    /**
     * 管理员删除课程
     *
     * @param id 课程编号
     * @return 成功与否
     */
    boolean deleteCourseById(String id);

    /**
     * 查询所有可选修课程
     *
     * @return 返回查询结果集
     */
    List<CourseEntity> findOptionalCoursesList();

    /**
     * 分页查询,推荐使用前端js进行分页操作
     *
     * @param size       每页数量
     * @param pageNumber 第几页
     * @return 返回该页所有数据
     */
    @Deprecated
    List<CourseEntity> pagingQuery(int size, int pageNumber);

    /**
     * 查询课程数据条数
     *
     * @return 返回课程数据条数
     */
    int count();

    /**
     * 查询当前学生是否已选择该课程
     *
     * @param courseId  课程编号
     * @param studentId 学生编号
     * @return 返回是否存在该条记录
     */
    boolean isExist(String courseId, String studentId);

    /**
     * 学生选课
     *
     * @param courseId  课程id
     * @param studentId 学号
     * @return 返回选课状态信息：0-》该课程已被选择，1-》成功，2-》数量超过上限，3-》服务器异常
     */
    ErrorCodeEnum selectCourse(String courseId, String studentId);

    /**
     * 查询所有课程（课表）
     *
     * @param id 学号
     * @return 返回课程集合
     */
    CourseEntity[][] queryAllCourse(String id);

    /**
     * 查询学生已选课程
     *
     * @param studentId 学生id
     * @return 返回查询结果集
     */
    List<CourseEntity> findSelectedCourseList(String studentId);

    /**
     * 学生退课
     *
     * @param courseId  课程id
     * @param studentId 学号
     * @return 成功与否
     */
    int dropCourse(String courseId, String studentId);

    /**
     * 管理员查询学生选的课
     */
    List<CourseEntity> getStudentCourseById(String studentId);

    /*
    管理员帮学生删课
     */
    boolean deleteStudentCourse(String studentId, String courseId);

    /*
    管理员帮助学生选课
     */
    boolean addStudentCourse(String studentId, String courseId);

    /**
     * 管理员通过id查询课程
     * @param id 课程id
     * @return 返回查询的结果
     */
    CourseEntity getById(String id);
}
